﻿using System;
using System.Collections;
using System.Text;
using System.Data;
using System.Configuration;
using System.Security.Cryptography;
using NGI_Entidades;
using NGI_BaseDatos;
using NGI_Auxiliares;

namespace NGI_Logica
{
    public class Usuarios
    {
        public static Boolean Loguear(Usuario UsuarioALoguear)
        {
            Parametro[] ListadoParametros = new Parametro[2];
            ListadoParametros[0] = new Parametro("@chvNombreUsuario", UsuarioALoguear.NombreUsuario);
            ListadoParametros[1] = new Parametro("@chvContrasena", UsuarioALoguear.Contrasena);

            DataTable dt = BaseDatos.Traer("proc_LoguearUsuario", ListadoParametros);
            if (dt.Rows.Count == 0)
                return false;

            DataRow dr = dt.Rows[0];
            Rol RolDelUsuario = new Rol(Convert.ToInt32(dr["IDRol"].ToString()), dr["NombreRol"].ToString());
            UsuarioALoguear.Soy(Convert.ToInt32(dr["IDUsuario"].ToString()), dr["Nombre"].ToString(), dr["Apellido"].ToString(), RolDelUsuario);
            return true;
        }

        public static Int32 ObtenerCantidadPermisosDelUsuario(Usuario UsuarioElegido)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioElegido.ID);

            DataTable dt = BaseDatos.Traer("proc_ObtenerCantidadDePermisosDeUsuario", ListadoParametros);
            if (dt.Rows.Count == 0)
                return 0;

            return Convert.ToInt32(dt.Rows[0]["Cantidad"].ToString());
        }

        public static Permiso[] ObtenerPermisosDelUsuario(Usuario UsuarioElegido)
        {
            return Usuarios.ObtenerPermisosDelUsuario(UsuarioElegido, 0);
        }

        public static Permiso[] ObtenerPermisosDelUsuario(Usuario UsuarioElegido, Int32 Limite)
        {
            Permiso[] PermisosDeUsuario;
            Parametro[] ListadoParametros;
            if (Limite > 0)
            {
                ListadoParametros = new Parametro[2];
                ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioElegido.ID);
                ListadoParametros[1] = new Parametro("@intLimite", Limite);
            }
            else
            {
                ListadoParametros = new Parametro[1];
                ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioElegido.ID);
            }

            DataTable dt = BaseDatos.Traer("proc_ObtenerPermisosDeUsuario", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new Permiso[0];

            PermisosDeUsuario = new Permiso[dt.Rows.Count];

            int contador = 0;
            foreach (DataRow dr in dt.Rows)
            {
                PermisosDeUsuario[contador] = new Permiso(Convert.ToInt32(dr["Id"].ToString()), dr["Nombre"].ToString(), dr["Descripcion"].ToString());
                contador++;
            }

            return PermisosDeUsuario;
        }

        public static ArrayList CargarTodos()
        {
            ArrayList ListadoUsuarios;

            DataTable dt = BaseDatos.Traer("proc_ObtenerUsuariosExistentesParaListar");
            if (dt.Rows.Count == 0)
                return new ArrayList();

            ListadoUsuarios = new ArrayList();
            foreach (DataRow dr in dt.Rows)
            {
                Usuario unUsuario = Usuario.ParaListar(Convert.ToInt32(dr["ID"].ToString()), dr["Nombre"].ToString(), dr["Apellido"].ToString());
                ListadoUsuarios.Add(unUsuario);
            }

            return ListadoUsuarios;
        }

        public static Usuario TraerDatosDe(Int32 Id)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intUsuarioID", Id);

            DataTable dt = BaseDatos.Traer("proc_ObtenerUsuario", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new Usuario();

            DataRow dr = dt.Rows[0];
            Rol unRol = Rol.RolDeUsuario(Convert.ToInt32(dr["Rol_Id"].ToString()), dr["NombreRol"].ToString(), dr["Descripcion"].ToString(), Convert.ToInt32(dr["Posicion"].ToString()));
            return Usuario.UsuarioExistente(Convert.ToInt32(dr["Id"].ToString()), dr["Nombre"].ToString(), dr["Apellido"].ToString(), dr["NombreUsuario"].ToString(), dr["Email"].ToString(), Convert.ToBoolean(dr["Activo"].ToString()), unRol);
        }

        public static void Eliminar(Int32 IDProducto)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intUsuarioID", IDProducto);
            BaseDatos.Ejecutar("proc_EliminarUsuario", ListadoParametros);
        }

        public static void Crear(Usuario UsuarioNuevo, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[8];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@chvNombre", UsuarioNuevo.Nombre);
            ListadoParametros[2] = new Parametro("@chvApellido", UsuarioNuevo.Apellido);
            ListadoParametros[3] = new Parametro("@chvNombreUsuario", UsuarioNuevo.NombreUsuario);
            ListadoParametros[4] = new Parametro("@chvContrasena", UsuarioNuevo.Contrasena);
            ListadoParametros[5] = new Parametro("@chvEmail", UsuarioNuevo.Email);
            ListadoParametros[6] = new Parametro("@intRolID", UsuarioNuevo.MiRol.ID);
            ListadoParametros[7] = new Parametro("@bitActivo", UsuarioNuevo.Activo);

            BaseDatos.Ejecutar("proc_InsertarUsuario", ListadoParametros);
        }


        public static void Modificar(Usuario UsuarioExistente, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[8];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@intUsuarioAModificarID", UsuarioExistente.ID);
            ListadoParametros[2] = new Parametro("@chvNombre", UsuarioExistente.Nombre);
            ListadoParametros[3] = new Parametro("@chvApellido", UsuarioExistente.Apellido);
            ListadoParametros[4] = new Parametro("@chvNombreUsuario", UsuarioExistente.NombreUsuario);
            ListadoParametros[5] = new Parametro("@chvEmail", UsuarioExistente.Email);
            ListadoParametros[6] = new Parametro("@intRolID", UsuarioExistente.MiRol.ID);
            ListadoParametros[7] = new Parametro("@bitActivo", UsuarioExistente.Activo);

            BaseDatos.Ejecutar("proc_ModificarUsuario", ListadoParametros);
        }

        public static void ModificarContrasena(Usuario UsuarioExistente, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[3];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@intUsuarioAModificarID", UsuarioExistente.ID);
            ListadoParametros[2] = new Parametro("@chvContrasena", UsuarioExistente.Contrasena);

            BaseDatos.Ejecutar("proc_ModificarContrasenaUsuario", ListadoParametros);
        }

        public static Boolean ChequearContrasenaCorrecta(Int32 ID, String ContrasenaActual)
        {
            Parametro[] ListadoParametros = new Parametro[2];
            ListadoParametros[0] = new Parametro("@intUsuarioID", ID);
            ListadoParametros[1] = new Parametro("@chvContrasena", ContrasenaActual);

            DataTable dt = BaseDatos.Traer("proc_ChequearPasswordCoincide", ListadoParametros);
            return dt.Rows.Count > 0;
            
        }
    }
}
